/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.compra.controlador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.clases.RutaProyecto;
import sv.com.intesal.clases.XMLReporte;
import sv.com.intesal.clases.cVarios;
import sv.com.intesal.compra.bean.Compra;
import sv.com.intesal.compra.bean.Material;
import sv.com.intesal.compra.sql.SQLCompra;
import sv.com.intesal.conexion.cConexion;
import sv.com.intesal.seguridad.controlador.BitacoraControlador;
import sv.com.intesal.seguridad.controlador.SessionControlador;

/**
 *
 * @author Jerez
 */
public class CompraControlador {

    public void setEnca(Compra c, List<Compra> lista) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        SessionControlador sc = new SessionControlador();
        cVarios v = new cVarios();
        try {
            cnn = cConexion.conectar();
            if (c.getId_c() == null) {
                ps = cnn.prepareStatement(SQLCompra.insertEncaCompra);
                ps.setInt(1, c.getOrdenCompra().getId_oc());
                ps.setInt(2, sc.getCodigo_Usuario());
                ps.setDate(3, cVarios.getFecha(c.getFecha_c()));
                ps.setDate(4, cVarios.getFecha(c.getFecha_documento_c()));
                ps.setString(5, c.getTipo_c());
                ps.setString(6, c.getTipo_documento_c());
                ps.setString(7, c.getObservacion_c());
                ps.setString(8, c.getFactura_c());
                ps.setDouble(9, v.AproximarDecimal(c.getPercepcion_c()));
                ps.setString(11, "AC");

                if (c.getTipo_documento_c().equals("Credito")) {
                    ps.setInt(10, c.getPlazo_c());
                    ps.setString(12, "P");
                } else {
                    ps.setInt(10, 0);
                    ps.setString(12, "C");
                }
                //ps.setInt(13, c.getOrdenCompra().getId_p());
            } else {
                ps = cnn.prepareStatement(SQLCompra.modificarEncaCompra);
                ps.setDate(1, cVarios.getFecha(c.getFecha_c()));
                ps.setDate(2, cVarios.getFecha(c.getFecha_documento_c()));
                ps.setString(3, c.getTipo_c());
                ps.setString(4, c.getTipo_documento_c());
                ps.setString(5, c.getObservacion_c());
                ps.setString(6, c.getFactura_c());
                ps.setDouble(7, v.AproximarDecimal(c.getPercepcion_c()));
                ps.setInt(8, c.getPlazo_c());
                ps.setString(9, c.getEstado_c());
                ps.setInt(10, c.getId_c());
                //ps.setInt(11, c.getId_p());
            }
            ps.executeUpdate();

            this.setDeta(c, lista);

            Mensaje m = new Mensaje();
            if (c.getId_c() == null) {
                m.messageInfo(m.getIinformation());
            } else {
                m.messageInfo(m.getImodificada());
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void setDeta(Compra c, List<Compra> lista) throws Exception {

        try {
            Integer codigo_c = c.getId_c();
            if (c.getId_c() == null) {
                codigo_c = this.getMax();
            }

            MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            for (int i = 0; i < lista.size(); i++) {
                cVarios v = new cVarios();
                if (lista.get(i).getId_d() == 0) {

                    PreparedStatement ps = null;
                    Connection cnn = null;
                    cnn = cConexion.conectar();
                    ps = cnn.prepareStatement(SQLCompra.insertDetaCompra);

                    ps.setInt(1, lista.get(i).getId_dm());
                    ps.setInt(2, codigo_c);
                    ps.setDouble(3, lista.get(i).getCantidad_d());
                    ps.setDouble(4, v.AproximarDecimal(lista.get(i).getCosto_cd_d()));
                    ps.setDouble(5, v.AproximarDecimal(lista.get(i).getIva_d()));
                    ps.setDouble(6, v.AproximarDecimal(lista.get(i).getDescuento_d()));
                    ps.setDouble(7, v.AproximarDecimal(lista.get(i).getPorcentaje_descuento_d()));
                    ps.setDouble(8, v.AproximarDecimal(lista.get(i).getExento_d()));
                    ps.executeUpdate();

                    ps.close();
                    mc.setCantidadMaterial_Aumentar_Disminuir(codigo_c, lista.get(i).getId_dm(), lista.get(i).getCantidad_d(), "A", bc.ingresarCompra + ": " + lista.get(0).getFactura_c(), lista.get(0).getFactura_c(), bc.ingresarCompra);
                } else {
                    if (this.validarCompraModificar_Cantidades(lista.get(i).getId_d(), lista.get(i).getCantidad_d()) == true) {
                        /*Valida si la cantidad en el grid de COMPRA se ha modificado. Si se ha modificado entonces
                        no se puede modificar ningun registro del detalle. Esto es una restriccion del programador 03-Mayo-2012 */

                        PreparedStatement ps = null;
                        Connection cnn = null;
                        cnn = cConexion.conectar();
                        ps = cnn.prepareStatement(SQLCompra.updateDetaCompra);

                        ps.setInt(1, lista.get(i).getId_dm());
                        ps.setInt(2, codigo_c);
                        ps.setDouble(3, lista.get(i).getCantidad_d());
                        ps.setDouble(4, v.AproximarDecimal(lista.get(i).getCosto_cd_d()));
                        ps.setDouble(5, v.AproximarDecimal(lista.get(i).getIva_d()));
                        ps.setDouble(6, v.AproximarDecimal(lista.get(i).getDescuento_d()));
                        ps.setDouble(7, v.AproximarDecimal(lista.get(i).getPorcentaje_descuento_d()));
                        ps.setDouble(8, v.AproximarDecimal(lista.get(i).getExento_d()));
                        ps.setInt(9, lista.get(i).getId_d());
                        ps.executeUpdate();

                        ps.close();
                    }
                }
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private Boolean validarCompraModificar_Cantidades(Integer id_d, Double cantidad) throws Exception {
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLCompra.validarCantidadModificarCompra);
            ps.setInt(1, id_d);
            ps.setDouble(2, cantidad);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                if (rs.getInt("contar") == 1) {
                    return true;
                }
            }
            return false;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void setEliminarItem(Compra c) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLCompra.eliminarDetaCompraItem);
            ps.setInt(1, c.getId_d());
            ps.executeUpdate();

            MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            mc.setCantidadMaterial_Aumentar_Disminuir(c.getId_c(), c.getId_dm(), c.getCantidad_d(), "D", bc.eliminarItemCompra + ": " + c.getFactura_c(), c.getFactura_c(), bc.eliminarItemCompra);
            bc.setBitacoraAnulacion(c.getId_c(), bc.eliminarItemCompra + ": " + c.getFactura_c(), bc.eliminarItemCompra);

            Mensaje m = new Mensaje();
            m.messageInfo(m.getIeliminada());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validar_ItemEliminarCompra(Compra c) throws Exception {

        try {
            MaterialControlador mc = new MaterialControlador();
            if (mc.validar_cantidad(c.getId_dm(), c.getCantidad_d()) == false) {
                return false;
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public Integer getMax() throws Exception {

        try {
            ResultSet rs = cConexion.conectar().prepareStatement(SQLCompra.getMax).executeQuery();
            rs.next();
            return rs.getInt("max");
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void cambiarEstado(String estado, Integer codigo_dp) throws Exception {
        PreparedStatement ps = null;
        Connection cnn = null;
        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLCompra.cambiarEstadoCompra);
            ps.setString(1, estado);
            ps.setInt(2, codigo_dp);
            ps.executeUpdate();

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validar_estado_accion_anular_modificar(Integer id_oc) throws Exception {
        //Valida si tiene permisos para modificar, anular o utilizar para otro proceso como es devolucion y abono a compra
        //Solamente el AC=activo puede hacerlo
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLCompra.getEstado);
            ps.setInt(1, id_oc);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                if (rs.getString("estado_c").equals("AC")) {
                    return true;// devuelve true cuando el registro tiene AC
                }
            }
            return false;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void modificarCompra(Compra c) throws Exception {
        try {
            SessionControlador sc = new SessionControlador();
            sc.redireccionar_Codigo_Proceso_Modifcar(c.getId_c(), RutaProyecto.wfrmCompra_Modificar);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void anularCompra(List<Compra> lista) throws Exception {
        try {
            MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            for (int i = 0; i < lista.size(); i++) {
                mc.setCantidadMaterial_Aumentar_Disminuir(lista.get(i).getId_c(), lista.get(i).getId_dm(), lista.get(i).getCantidad_d(), "A", bc.anulacionCompra + ": " + lista.get(0).getFactura_c(), lista.get(0).getFactura_c(), bc.anulacionCompra);
            }
            bc.setBitacoraAnulacion(lista.get(0).getId_c(), bc.anulacionCompra + ": " + lista.get(0).getFactura_c(), bc.anulacionCompra);
            this.cambiarEstado("A", lista.get(0).getId_c());

            Mensaje m = new Mensaje();
            m.messageInfo(m.getIanulada());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validarCantidad_AnularCompra(Integer codigo_c) throws Exception {
        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            Boolean var_return = true;

            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLCompra.validarCantidadAnular);
            ps.setInt(1, codigo_c);
            rs = ps.executeQuery();

            Mensaje m = new Mensaje();
            while (rs.next()) {
                MaterialControlador mc = new MaterialControlador();
                if (mc.validar_cantidad(rs.getInt("id_dm"), rs.getDouble("suma")) == false) {
                    var_return = false;
                    m.messageAdvertencia(m.getIcantidad() + ": " + rs.getString("nombre_m"));
                }
            }

            ps.close();
            rs.close();
            cnn.close();

            return var_return;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Compra getEnca(Integer codigo_c) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLCompra.getEncaCompra);
            ps.setInt(1, codigo_c);
            rs = ps.executeQuery();
            rs.next();

            Compra c = new Compra();

            /*ENCA*/
            c.setId_c(rs.getInt("id_c"));
            c.setId_oc(rs.getInt("id_oc"));
            c.setFecha_c(rs.getDate("fecha_c"));
            c.setFecha_documento_c(rs.getDate("fecha_documento_c"));
            c.setFechahora(rs.getTime("fechahora"));

            c.setTipo_c(rs.getString("tipo_c"));
            c.setTipo_documento_c(rs.getString("tipo_documento_c"));

            c.setObservacion_c(rs.getString("observacion_c"));
            c.setFactura_c(rs.getString("factura_c"));
            c.setPercepcion_c(rs.getDouble("percepcion_c"));
            c.setPlazo_c(rs.getInt("plazo_c"));
            c.setEstado_c(rs.getString("estado_c"));

            /*EMPRESA*/
            c.setNombre_em(rs.getString("nombre_em"));
            c.setId_em(rs.getInt("id_em"));

            /*USUARIO*/
            c.setId_u(rs.getInt("id_u"));
            c.setUsuario_u(rs.getString("usuario_u"));

            /*PROVEEDOR*/
            c.setId_p(rs.getInt("id_p"));
            c.setEmpresa_p(rs.getString("empresa_p"));
            c.setAplica_percepcion_p(rs.getString("aplicar_percepcion_p"));
            c.setNit_p(rs.getString("nit_p"));

            cnn.close();
            ps.close();
            rs.close();

            return c;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<Compra> getDeta_Compra(Integer codigo_c) throws Exception {

        List<Compra> lista = new ArrayList<Compra>();
        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLCompra.getConsulta_DetaCompra);
            ps.setInt(1, codigo_c);
            rs = ps.executeQuery();


            cVarios v = new cVarios();
            while (rs.next()) {
                Compra c = new Compra();

                c.setId_d(rs.getInt("id_d"));
                c.setId_dm(rs.getInt("id_dm"));
                c.setId_c(rs.getInt("id_c"));

                c.setCantidad_d(rs.getDouble("cantidad_d"));
                c.setCosto_d(v.AproximarDecimal(rs.getDouble("costo_d")));
                c.setIva_d(v.AproximarDecimal(rs.getDouble("iva_d")));
                c.setDescuento_d(v.AproximarDecimal(rs.getDouble("descuento_d")));
                c.setCosto_d(v.AproximarDecimal(rs.getDouble("costo_d")));
                c.setCosto_cd_d(v.AproximarDecimal(rs.getDouble("costo_d")));
                c.setCosto_sd_d(v.AproximarDecimal(c.getCosto_d() + c.getDescuento_d()));
                c.setPorcentaje_descuento_d(v.AproximarDecimal(rs.getDouble("porcentaje_descuento_d")));
                c.setExento_d(v.AproximarDecimal(rs.getDouble("exento_d")));
                //c.setSubTotal_c(v.AproximarDecimal( (c.getCantidad_d() * c.getCosto_d()) + (1 - c.getPorcentaje_descuento_d()) + c.getExentos_d() + c.getIva_d()));
                c.setSubTotal_d(v.AproximarDecimal((c.getCantidad_d() * c.getCosto_d()) + c.getExento_d() + c.getIva_d()));

                /*MATERIAL */
                c.setNombre_m(rs.getString("nombre_m"));
                lista.add(c);
            }
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Double getCantidad_x_Correlativo(Integer id_d) throws Exception {

        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLCompra.getCantidad_x_Correlativo);
            ps.setInt(1, id_d);
            ResultSet rs = ps.executeQuery();

            Double cantidad = 0.00;
            while (rs.next()) {
                cantidad = rs.getDouble("cantidad_d");
            }
            return cantidad;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<Compra> getConsulta_EncaCompra(Compra co) throws Exception {
        List<Compra> lista = new ArrayList<Compra>();
        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            cnn = cConexion.conectar();

            String var_estado = " and c.estado_c='AC' ";
            String var_fechas = this.getFiltro_Fechas(co);
            String var_proveedor = this.getFiltro_Proveedor(co);

            if (co.getFiltrar_estado() == true) {
                var_estado = " "; //trae todos los estados.
            }
            String sql = "SELECT c.*,em.*,p.*,s.nombre_s,u.usuario_u,u.id_u,s.codigo_s FROM ENCA_COMPRA as c,ORDEN_COMPRA as oc,EMPRESA as em,PROVEEDOR as p,USUARIO as u,SUCURSAL as s where p.id_p=oc.id_p and em.id_em=oc.id_em and oc.id_oc=c.id_oc and u.id_u=c.id_u and s.codigo_s=oc.codigo_s " + var_estado + var_fechas + var_proveedor + "order by c.fecha_c,c.tipo_c,c.factura_c,p.empresa_p ";
            //System.out.println("sql= " + sql);

            ps = cnn.prepareStatement(sql);
            rs = ps.executeQuery();

            while (rs.next()) {
                Compra c = new Compra();

                /*ENCA*/
                c.setId_c(rs.getInt("id_c"));
                c.setId_oc(rs.getInt("id_oc"));
                c.setFecha_c(rs.getDate("fecha_c"));
                c.setFecha_documento_c(rs.getDate("fecha_documento_c"));
                c.setFechahora(rs.getTime("fechahora"));

                c.setTipo_c(rs.getString("tipo_c"));
                c.setTipo_documento_c(rs.getString("tipo_documento_c"));

                c.setObservacion_c(rs.getString("observacion_c"));
                c.setFactura_c(rs.getString("factura_c"));
                c.setPercepcion_c(rs.getDouble("percepcion_c"));
                c.setPlazo_c(rs.getInt("plazo_c"));
                c.setEstado_c(rs.getString("estado_c"));

                /*EMPRESA*/
                c.setNombre_em(rs.getString("nombre_em"));
                c.setId_em(rs.getInt("id_em"));

                /*USUARIO*/
                c.setId_u(rs.getInt("id_u"));
                c.setUsuario_u(rs.getString("usuario_u"));

                /*PROVEEDOR*/
                c.setId_p(rs.getInt("id_p"));
                c.setEmpresa_p(rs.getString("empresa_p"));
                lista.add(c);
            }

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Double getCompraTotal(Integer codigo_c) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLCompra.getTotalCompra);
            ps.setInt(1, codigo_c);
            rs = ps.executeQuery();
            rs.next();
            return rs.getDouble("Total_Compra");
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void redireccionar_AbonoCompra(Compra c) throws Exception {
        try {
            SessionControlador sc = new SessionControlador();
            sc.redireccionar_Codigo_Proceso_Modifcar(c.getId_c(), RutaProyecto.wfrmAbonoCompra);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void redireccionar_DevolucionCompra(Compra c) throws Exception {
        try {
            SessionControlador sc = new SessionControlador();
            sc.redireccionar_Codigo_Proceso_Modifcar(c.getId_c(), RutaProyecto.wfrmDevolucionCompra);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private String getFiltro_Fechas(Compra co) {
        try {
            String var_fechas = " ";
            if (co.getFecha_i() != null && co.getFecha_f() == null) {
                var_fechas = " and c.fecha_c >='" + cVarios.getFecha(co.getFecha_i()) + "' ";
            } else if (co.getFecha_f() != null && co.getFecha_i() == null) {
                var_fechas = " and c.fecha_c <='" + cVarios.getFecha(co.getFecha_f()) + "' ";
            } else if (co.getFecha_i() == null && co.getFecha_f() == null) {
                var_fechas = " ";
            } else {
                var_fechas = " and c.fecha_c between '" + cVarios.getFecha(co.getFecha_i()) + "' and '" + cVarios.getFecha(co.getFecha_f()) + "' ";
            }
            return var_fechas;
        } catch (Exception e) {
            return " ";
        }
    }

    private String getFiltro_Fechas(Material ma) {
        try {
            String var_fechas = " ";
            if (ma.getFecha_i() != null && ma.getFecha_f() == null) {
                var_fechas = " and c.fecha_c >='" + cVarios.getFecha(ma.getFecha_i()) + "' ";
            } else if (ma.getFecha_f() != null && ma.getFecha_i() == null) {
                var_fechas = " and c.fecha_c <='" + cVarios.getFecha(ma.getFecha_f()) + "' ";
            } else if (ma.getFecha_i() == null && ma.getFecha_f() == null) {
                var_fechas = " ";
            } else {
                var_fechas = " and c.fecha_c between '" + cVarios.getFecha(ma.getFecha_i()) + "' and '" + cVarios.getFecha(ma.getFecha_f()) + "' ";
            }
            return var_fechas;
        } catch (Exception e) {
            return " ";
        }
    }

    private String getFiltro_Proveedor(Compra co) {
        try {
            String var_proveedor = " and p.id_p=" + co.getId_p() + " ";

            if (co.getId_p() == null) {
                var_proveedor = " ";//trae todos los proveedores.
            }
            return var_proveedor;
        } catch (Exception e) {
            return " ";
        }
    }

    public Compra getTotales_x_Compra(Integer codigo_compra) throws Exception {
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLCompra.getTotales_x_Compra);
            ps.setInt(1, codigo_compra);
            ResultSet rs = ps.executeQuery();

            cVarios v = new cVarios();
            Compra c = new Compra();
            while (rs.next()) {
                c.setTotalCosto_c(v.AproximarDecimal(rs.getDouble("total_costo_cd")));
                c.setTotal_descuento_c(v.AproximarDecimal(rs.getDouble("total_descuento")));
                c.setTotal_exento_c(v.AproximarDecimal(rs.getDouble("total_exento")));
                c.setTotal_iva_c(v.AproximarDecimal(rs.getDouble("total_iva")));
                c.setTotal_costo_sd_c(v.AproximarDecimal(rs.getDouble("total_costo_sd")));
                c.setTotal_costo_cd_c(v.AproximarDecimal(rs.getDouble("total_costo_cd")));

                c.setTotal_subTotal_c(v.AproximarDecimal(rs.getDouble("sub_total_compra")));
                c.setTotal_percepcion_c(v.AproximarDecimal(rs.getDouble("total_percepcion")));
                c.setTotal_c(v.AproximarDecimal(rs.getDouble("total_compra")));
            }
            ps.close();
            rs.close();
            return c;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void redireccionarWfrmPrincipal() throws Exception {
        try {
            SessionControlador sc = new SessionControlador();
            sc.redireccionar(RutaProyecto.wfrmPrincipal);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<Compra> getCompraMaterial(Material m) throws Exception {
        List<Compra> lista = new ArrayList<Compra>();
        try {

            String sql = SQLCompra.getCompra_x_Material;
            sql += this.getFiltro_Fechas(m);
            sql += " order by c.fecha_c,c.factura_c ";

            //System.out.println(sql);
            PreparedStatement ps = cConexion.conectar().prepareStatement(sql);
            ps.setInt(1, m.getId_dm());
            ResultSet rs = ps.executeQuery();

            cVarios v = new cVarios();
            while (rs.next()) {
                Compra c = new Compra();
                c.setCantidad_d(rs.getDouble("cantidad_d"));
                c.setCosto_cd_d(v.AproximarDecimal(rs.getDouble("costo_d")));
                c.setTotal_c(v.AproximarDecimal(rs.getDouble("total_c")));
                c.setEmpresa_p(rs.getString("empresa_p"));
                c.setFactura_c(rs.getString("factura_c"));
                c.setFecha_c(rs.getDate("fecha_c"));
                lista.add(c);
            }
            rs.close();
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    /**********************************************************************************************/
    /*REPORTES DE COMPRA*/
    /**
     * Generar Reporte de Cuentas por Pagar.
     * @return nothing
     * @exception Exception
     */
    public void generarReporte_Compra_CostoCantidad_Linea_SubLinea(Compra co) throws Exception {

        try {
            String var_estado = " and c.estado_c='AC' ";
            String var_fechas = this.getFiltro_Fechas(co);
            String var_proveedor = " and p.id_p=" + co.getId_p() + " ";

            if (co.getId_p() == null) {
                var_proveedor = " ";//trae todos los proveedores.
            }

            String sql = " Select c.fecha_c,c.tipo_c,c.tipo_documento_c,c.factura_c,p.empresa_p,c.estado_c, "
                    + " COALESCE(sum( (d.cantidad_d*d.costo_d) +  d.exento_d),0) as gravado, "
                    + " COALESCE(sum(d.iva_d),0) as iva, "
                    + " COALESCE(sum( (d.cantidad_d*d.costo_d) + d.iva_d + d.exento_d),0) as total_compra "
                    + " from enca_compra as c "
                    + " inner join orden_compra as oc on oc.id_oc=c.id_oc "
                    + " inner join proveedor as p on p.id_p=oc.id_p "
                    + " inner join deta_compra as d on c.id_c=d.id_c  "
                    + " where c.estado_c='AC' "
                    + var_estado + var_fechas + var_proveedor
                    + " group by c.fecha_c,c.tipo_c,c.tipo_documento_c,c.factura_c,p.empresa_p,c.estado_c ";

            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void generarReporte_Compra_x_Producto(Compra co) throws Exception {
        try {
            String var_estado = " and c.estado_c='AC' ";
            String var_fechas = this.getFiltro_Fechas(co);
            String var_proveedor = " and p.id_p=" + co.getId_p() + " ";

            if (co.getId_p() == null) {
                var_proveedor = " ";//trae todos los proveedores.
            }

            String sql = " select p.empresa_p,m.nombre_m,m.codigo_barra_m,cat.nombre_cat,sc.nombre_su,c.fecha_c,c.factura_c, "
                    + " COALESCE(sum(d.cantidad_d),0) as cantidad, "
                    + " COALESCE(sum(d.costo_d),0) as costo, "
                    + " ( COALESCE(sum(d.cantidad_d),0) + COALESCE(sum(d.costo_d),0) ) as total	 "
                    + " from enca_compra as c "
                    + " inner join orden_compra as oc on oc.id_oc=c.id_oc "
                    + " inner join proveedor as p on p.id_p=oc.id_p "
                    + " inner join deta_compra as d on c.id_c=d.id_c  "
                    + " inner join material_sucursal ms on ms.id_dm=d.id_dm "
                    + " inner join material as m on m.id_m=ms.id_m "
                    + " inner join sub_categoria as sc on sc.id_su=m.id_su "
                    + " inner join categoria as cat on cat.id_cat=sc.id_cat "
                    + " where c.estado_c='AC' "
                    + var_estado + var_fechas + var_proveedor
                    + " group by p.empresa_p,m.nombre_m,m.codigo_barra_m,cat.nombre_cat,sc.nombre_su,c.fecha_c,c.factura_c ";

            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void generarReporte_Compra_Reporte1(Compra co) throws Exception {
        try {
            String var_estado = " and c.estado_c='AC' ";
            String var_fechas = this.getFiltro_Fechas(co);
            String var_proveedor = " and p.id_p=" + co.getId_p() + " ";

            if (co.getId_p() == null) {
                var_proveedor = " ";//trae todos los proveedores.
            }

            String sql = "select c.fecha_c,c.tipo_c,c.tipo_documento_c,c.factura_c,p.empresa_p,c.estado_c, "
                    + " COALESCE(sum( (d.cantidad_d*d.costo_d) +  d.exento_d),0) as gravado, "
                    + " COALESCE(sum(d.iva_d),0) as iva, "
                    + " COALESCE(sum( (d.cantidad_d*d.costo_d) + d.iva_d + d.exento_d),0) as total_compra "
                    + " from enca_compra as c "
                    + " inner join orden_compra as oc on oc.id_oc=c.id_oc "
                    + " inner join proveedor as p on p.id_p=oc.id_p "
                    + " inner join deta_compra as d on c.id_c=d.id_c  "
                    + " where c.estado_c='AC' "
                    + var_estado + var_fechas + var_proveedor
                    + " group by c.id_c,c.fecha_c,c.tipo_c,c.tipo_documento_c,c.factura_c,p.empresa_p,c.estado_c ";

            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void generarReporte_Compra_OrdenDeCompra(Compra c) throws Exception {
        /*GENERAR LA MISMA ORDEN DE COMPRA PERO ATRAVES DE LA COMPRA*/
        try {
        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}
//    private Boolean validarCompraModificar_Cantidad_Existencias(Integer id_dm, List<Compra> lista) throws Exception {
//        try {
//            Double sum = 0.0;
//            for (int i = 0; i < lista.size(); i++) {
//                if (lista.get(i).getId_dm() == id_dm) {
//                    sum += lista.get(i).getCantidad_d();
//                }
//            }
//            MaterialControlador mc = new MaterialControlador();
//            if (mc.validar_cantidad(id_dm, sum) == true) {
//                return true;
//            }
//            return false;
//        } catch (Exception e) {
//            throw new Exception(e);
//        }
//    }

